/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.notaria.guerrasalas.be;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 *
 * @author Administrador
 */
@Entity
@Table(name = "PROVISIONAL")
@NamedQueries({
    @NamedQuery(name = "Provisional.findAll", query = "SELECT p FROM Provisional p"),
    @NamedQuery(name = "Provisional.findByCliente", query = "SELECT p FROM Provisional p WHERE UPPER(p.cliente.nombres) Like :nombres or UPPER(p.cliente.apellidoPaterno) Like :apPaterno or UPPER(p.cliente.apellidoMaterno) Like :apMaterno"),
    @NamedQuery(name = "Provisional.findBetweenDates", query = "SELECT p FROM Provisional p WHERE p.fechaCreacion BETWEEN :fechaInicio AND :fechaFin ORDER BY p.idDocumentoVenta DESC"),
    @NamedQuery(name = "Provisional.findBetweenDatesAndGastoRegistral", query = "SELECT p FROM Provisional p WHERE p.fechaCreacion BETWEEN :fechaInicio AND :fechaFin AND p.esGastoRegistral = TRUE ORDER BY p.idDocumentoVenta DESC")
})
@PrimaryKeyJoinColumn(name = "ID_PROVISIONAL", referencedColumnName = "ID_DOCUMENTO_VENTA")
@DiscriminatorValue(value = "PR")
public class Provisional
        extends DocumentoVenta
        implements Serializable {

    @Basic(optional = false)
    @Column(name = "ES_GASTO_REGISTRAL", nullable = false)
    private boolean esGastoRegistral;
    @Column(name = "MONTO_UTILIZADO", precision = 19, scale = 4)
    private Double montoUtilizado = 0.0;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "provisional", fetch = FetchType.LAZY)
    private List<CanjeDocumentoVenta> canjesDocumentoVenta;
    @Transient
    private boolean totalmenteUtilizado;
    @Transient
    private Double saldo = 0.0;

    public Provisional() {
    }

    public Provisional(Long idDocumentoVenta) {
        super(idDocumentoVenta);
    }

    public List<CanjeDocumentoVenta> getCanjesDocumentoVenta() {
        return canjesDocumentoVenta;
    }

    public void setCanjesDocumentoVenta(List<CanjeDocumentoVenta> canjesDocumentoVenta) {
        this.canjesDocumentoVenta = canjesDocumentoVenta;
    }

    public boolean isEsGastoRegistral() {
        return esGastoRegistral;
    }

    public void setEsGastoRegistral(boolean esGastoRegistral) {
        this.esGastoRegistral = esGastoRegistral;
    }

    public Double getMontoUtilizado() {
        return montoUtilizado;
    }

    public void setMontoUtilizado(Double montoUtilizado) {
        this.montoUtilizado = montoUtilizado;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final DocumentoVenta other = (DocumentoVenta) obj;
        if (this.idDocumentoVenta != other.idDocumentoVenta && (this.idDocumentoVenta == null || !this.idDocumentoVenta.equals(other.idDocumentoVenta))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 59 * hash + (this.idDocumentoVenta != null ? this.idDocumentoVenta.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return idDocumentoVenta.toString();
    }

    public boolean isTotalmenteUtilizado() {
        return totalmenteUtilizado;
    }

    public void setTotalmenteUtilizado(boolean totalmenteUtilizado) {
        this.totalmenteUtilizado = totalmenteUtilizado;
    }

    public Double getSaldo() {
        return saldo;
    }

    public void setSaldo(Double saldo) {
        this.saldo = saldo;
    }
}
